const fs = require('fs')
const path = require('path')

// 删除本地文件夹
async function rmdir(targetFilePath) {
	let stat = fs.statSync(targetFilePath)
	if (stat.isFile()) {
		fs.unlinkSync(targetFilePath)
	} else {
		let dirs = fs.readdirSync(targetFilePath)
		await Promise.all(dirs.map(dir => rmdir(path.join(targetFilePath, dir))))
		fs.rmdirSync(targetFilePath)
	}
}

/**
 * 删除本地文件夹下的文件
 * @param targetFilePath 目标路径
 * @returns {Promise}
 */
function deleteDir(targetFilePath) {
	return new Promise((resolve, reject) => {
		const files = fs.readdirSync(targetFilePath)
		Promise.all(files.map(dir => rmdir(path.join(targetFilePath, dir))))
			.then(resolve)
			.catch(reject)
	})
}

/**
 * 创建本地目录
 * @param dirPath 目标路径
 * @returns {Promise}
 */
function create(dirPath) {
	return new Promise((resolve, reject) => {
		fs.mkdir(dirPath, err => {
			if (err) {
				console.warn('本地文件夹创建失败', err)
			}
			resolve()
		})
	})
}
/**
 * 循环遍历本地文件夹
 * @param remote 目标文件夹路径
 * @param dir 本地文件路径
 * @param arr 待复制的文件列表
 * @param dirArr 目标文件夹的子文件夹路径列表，用于在复制文件时创建对应的文件夹
 * @returns {}
 */
const loopDirs = (remote, dir, arr, dirArr) => {
	// 获取文件夹
	let files = fs.readdirSync(dir)
	// 遍历当前文件夹下所有文件
	for (let file of files) {
		let fullpath = path.join(dir, file)
		// 获取文件
		let stat = fs.statSync(fullpath)
		if (stat.isFile()) {
			// 判断为文件则添加到arr中
			arr.push(fullpath)
		} else if (stat.isDirectory()) {
			// 判断为文件夹则遍历自身获取子文件
			let dirPath = path.join(remote, file)
			dirPath = dirPath.replace(/\\/g, '/')
			if (dirArr.indexOf(dirPath) === -1) {
				dirArr.push(dirPath)
			}
			loopDirs(remote + '/' + file, fullpath, arr, dirArr)
		}
	}
}
async function copyFile () {
	
}

/**
 * 复制文件夹
 * @param currentFile 目标文件夹的路径
 * @param targetFilePath 复制至对应目录的路径
 * @returns {Promise}
 */
async function copyDir(currentFile, targetFilePath) {
	let allFiles = []
	let allDirs = []
	try {
		fs.accessSync(targetFilePath, fs.constants.F_OK)
		// 删除targetFilePath下的所有文件
		await deleteDir(targetFilePath)
	} catch (e) {
		await create(targetFilePath)
	}

	// 获取到要复制的所有文件地址与要创建的targetFilePath文件夹下的所有子文件夹
	loopDirs(targetFilePath, currentFile, allFiles, allDirs)
	for (const dir of allDirs) {
		// 创建子文件夹
		await create(dir)
	}
	console.log('拷贝文件创建成功')

	
	// 进度条
	for (const file of allFiles) {
		let tartget = file.replace(/\\/g, '/')
		currentFile = currentFile.replace(/\\/g, '/')
		let targetPath = tartget.replace(currentFile, targetFilePath)
		targetPath = targetPath.replace(/\\/g, '/')
		// 下载对应路径的备份文件到本地备份文件指定路径中
		fs.copyFileSync(file, targetPath)
	}
	console.log('拷贝文件成功')
	return Promise.resolve()
}

module.exports = {
	deleteDir,
	create,
	copyDir
}
